/**
 * @file tsk_cmdstore.c
 * @brief tskp库 - 命令存储模块实现文件
 * @details
 * 本文件实现了tskp任务调参库的命令存储功能，包括命令的添加、删除、查找、哈希映射等操作。
 * 支持多任务ID与命令的高效绑定与查找，适合嵌入式、实时系统下的指令解析与管理。
 *
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 日期：2025-09-11
 */

#include"tsk_cmdstore.h"

#ifdef _TSK_TSKP_

#if TSK_CMD_SWITCH

/**
 * @brief        // 初始化命令存储结构体
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_cmdstore_Init(tsk_cmdstore_t* store){
    memset(store,0,sizeof(tsk_cmdstore_t));
}

/**
 * @brief        // 哈希函数，根据id生成哈希桶索引
 * @param[in]    // id : 任务ID
 * @return       // uint8_t : 哈希桶索引
 * @note         // 内部使用
 */
static uint8_t tsk_hash_id(uint8_t id){
    return (id * 2654435761U)&(TSK_HASH_TABLE_SIZE-1);
}

/**
 * @brief        // 判断id是否合法
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // id    : 任务ID
 * @return       // bool : true为合法，false为非法
 * @note         // 内部使用
 * @author       // 小傲
 * @date         // 2025-09-11
 */
static bool tsk_iscmdid(tsk_cmdstore_t* store,uint8_t id){
    if(store==NULL){
        return false;
    }
    if(id<0||id>=TSK_MAX_TASKS){
        return false;
    }
    return true;
}

/**
 * @brief        // 添加命令到命令存储
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // id    : 任务ID
 * @param[in]    // cmd   : 命令字符串
 * @return       // bool : true添加成功，false失败
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_add_cmd(tsk_cmdstore_t* store,uint8_t id,const char * cmd){
    if(!tsk_iscmdid(store,id)){
        return false;
    }
    if(strlen(cmd)>=TSK_MAX_STRING_LEN||store->node_count>=TSK_MAX_TOTAL_NODES){
        return false;
    }
    uint8_t bucket =tsk_hash_id(id);
    tsk_cmdNode* new_node=&store->nodes[store->node_count++];
    
    new_node->id=id;
    strncpy(new_node->cmd,cmd,TSK_MAX_STRING_LEN-1);
    new_node->cmd[TSK_MAX_STRING_LEN-1]='\0';
    new_node->next=store->buckets[bucket];

    store->buckets[bucket]=new_node;

    return true;
}

/**
 * @brief        // 删除指定id和命令的节点
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // id    : 任务ID
 * @param[in]    // cmd   : 命令字符串
 * @return       // bool : true删除成功，false失败
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_del_cmd(tsk_cmdstore_t* store,uint8_t id,const char * cmd){
    if(!tsk_iscmdid(store,id)){
        return false;
    }
    uint8_t bucket =tsk_hash_id(id);
    tsk_cmdNode* current=store->buckets[bucket];
    tsk_cmdNode* prev =NULL;
    while (current!=NULL){
        if(current->id==id&&strcmp(current->cmd,cmd)==0){
            if(prev==NULL){
                store->buckets[bucket]=current->next;
            }
            else{
                prev->next=current->next;
            }
            return true;
        }
        prev=current;
        current=current->next;
    }
    return false;
}

/**
 * @brief        // 查找指定id和命令是否存在
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // id    : 任务ID
 * @param[in]    // cmd   : 命令字符串
 * @return       // bool : true存在，false不存在
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_seek_id_cmd(tsk_cmdstore_t* store,uint8_t id,const char * cmd){
    if(!tsk_iscmdid(store,id)){
        return false;
    }
    uint8_t bucket =tsk_hash_id(id);
    tsk_cmdNode* current=store->buckets[bucket];
    while (current!=NULL){
        if(current->id==id&&strcmp(current->cmd,cmd)==0){
            return true;
        }
        current=current->next;
    }
    return false;
}

/**
 * @brief        // 通过命令字符串查找id
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // cmd   : 命令字符串
 * @param[out]   // id    : 查找到的任务ID指针
 * @return       // bool : true查找成功，false失败
 * @note         // 速度较慢，需保证命令唯一性
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_seek_cmd(tsk_cmdstore_t* store,const char * cmd,uint8_t* id){
    uint8_t i=0;
    for(i=0;i<TSK_HASH_TABLE_SIZE;i++){
        tsk_cmdNode *current=store->buckets[i];
        while (current!=NULL){
            if(strcmp(current->cmd,cmd)==0){
                *id=current->id;
                return true;
            }
            current=current->next;
        }
    }
    return false;
}

/**
 * @brief        // 清除指定id下的所有命令
 * @param[in]    // store : 指向tsk_cmdstore_t结构体的指针
 * @param[in]    // id    : 任务ID
 * @return       // bool : true清除成功，false失败
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_clear_id_cmd(tsk_cmdstore_t* store,uint8_t id){
    if(!tsk_iscmdid(store,id)){
        return false;
    }
    uint8_t bucket =tsk_hash_id(id);
    store->buckets[bucket]=NULL;
    return true;
}

#endif 

#endif // _TSK_TSKP_

// TSK_CMD_SWITCH